﻿using System;

namespace linq委托
{
    internal class Program
    {
        static void Main(string[] args)
        {
            D1 d = f1;
            d();

            D2 d2 = Add;
            Console.WriteLine(d2(1, 2));

            Action d3 = f1;
            d3();

            Func<int, int, int> d4 = Add;
            Console.WriteLine(d4(1, 2));

            Func<int, int, string> d5 = F3;
            Console.WriteLine(d5(1, 2));

            Func<int, int, int> d6 = delegate (int i, int j)
            {
                return i + j;
            };
            Console.WriteLine(d6(1, 2));

            //lambda表达式
            Func<int, int, int> d7 = (int i, int j) =>
            {
                return i + j;
            };
            //lambda表达式，去掉参数类型
            Func<int, int, int> d8 = (i, j) =>
            {
                return i + j;
            };
            Console.WriteLine(d7(1, 2));
            //lambda表达式，有返回值
            Func<int, int, int> d12 = (i, j) => i + j;
            //lambda表达式，无返回值
            Action d9 = delegate ()
            {
                Console.WriteLine("我是d9");
            };
            Action d10 = () =>
            {
                Console.WriteLine("我是d10");
            };
            Action d11 = () => Console.WriteLine("我是d11");
            //如果只有一个参数，参数的()可以省略。
            Action<int> d13 = (i) => Console.WriteLine($"我是d13-{i}");
            Action<int> d14 = i => Console.WriteLine($"我是d13-{i}");
            Func<int, bool> d16 = delegate (int i)
            {
                return i > 5;
            };
            Func<int, bool> d17 = (int i) => i > 5;
            Func<int, bool> d18 = i => i > 5;

            //反推回去
            Func<int, bool> f2 = i => i > 5;
            Func<int, bool> d19 = delegate (int i)
            {
                return i > 5;
            };
        }

        static void f1()
        {
            Console.WriteLine("我是F1");
        }

        static void f2()
        {
            Console.WriteLine("我是F2");
        }

        static int Add(int i, int j)
        {
            return i + j;
        }

        static string F3(int i, int j)
        {
            return "sssss";
        }
    }

    /// <summary>
    /// 自定义委托
    /// </summary>
    delegate void D1();
    delegate int D2(int i, int j);
}